#include "list.h"
#include "Element_data.h"
#include "login.h"
#include"file.h"
#define NUM 100 // 定义进度条为100%加载

// 定义一个结构体成员，用于从键盘接受用户输入的账号和密码信息
stu my_user;
int flag = 0;       // flag标记用户名输入正确,正确为1
int num1, num2 = 0; // num1记录用户名输入错误次数,num记录密码输入错误次数


// 定义用户登录函数
void login(sq_list *L)
{
    L = use_users(L,file_path);
    L->len = Line_Num - 1;
    while (1)
    {
        int i;
        // 输入函数不能写在for循环里面,不然每次比较都要输入!
        printf("请输入你的用户名:");
        scanf("%s", my_user.name);
        
        // 循环遍历判断用户输入的用户名是否和系统存储的相等
        for (i = 0; i <= L->len; i++)
        {
            if (!strcmp(my_user.name, L->data[i].name)) // 使用strcmp函数比对用户名
            {
                printf("用户名正确!\n");
                flag = 1; // 用户名输入正确为1
                break;
            }
            else if (i == L->len) // 如果遍历完数组还没有匹配到对应的用户名则说明输入的用户名有误
            {
                printf("用户名错误,请重新输入!\n");
                num1++;
            }
        }

        // 判断密码是否正确
        while (flag)
        {
            printf("请输入你的密码:");
            scanf("%s", my_user.password);
            if (!strcmp(my_user.password, L->data[i].password)) // 使用strcmp函数比对用户密码
            {
                menu();
                return;
            }
            else
            {
                printf("密码错误,请重新输入:\n");
                num2++;
            }
            juge_in_times(&num1, &num2);
        }
        juge_in_times(&num1, &num2); // 判断输入次数是否超过三次,超过则需等待三秒
    }
}

// 定义进度条函数
void progress_bar(int seconds)
{
    system("clear");                             // 清除屏幕
    char buffer[NUM + 1] = {0};                  // 存储进度条字符
    char arr[5] = {"-/|\\"};                     // 存储基本的变化字符
    int usleep_time = (seconds * 1000000) / NUM; // 计算每次循环等待的微秒数

    for (int i = 0; i <= NUM; ++i)
    {
        // 更新进度条
        for (int j = 0; j < i; ++j)
        {
            buffer[j] = '>';
        }
        buffer[i] = '\0'; // 确保字符串正确结束

        // 打印进度条
        printf("[%-100s][%d%%][%c]\r", buffer, (i * 100) / NUM, arr[i % 4]);
        fflush(stdout); // 确保立即输出

        // 等待指定的微秒数
        usleep(usleep_time);
    }
    printf("\n"); // 进度条完成后换行
}

// 定义判断用户输入错误函数
// 用指针传递num1和num2的值才会修改
void juge_in_times(int *num1, int *num2)
{
    // 判断输入次数是否超过三次,超过则需等待三秒
    if ((*num1 + *num2) == 3)
    {
        *num1 = 0; // 重新清0,方便下次判断
        *num2 = 0;
        puts("用户名和密码累计输错3次!请3秒后重新输入!");
        sleep(1.5);
        progress_bar(3);
    }
}

// 添加用户(注册) 尾插,从终端输入
void add_user(sq_list *L, stu data)
{
    //接收文件中的数据
    // L = use_users(L,file_path);
    // 安全判断
    if (L==NULL||!IsFull_Sql_List(L))
    {
        printf("表为NULL或已满,无法添加用户\n");
        return;
    }
    printf("请按顺序输入以下内容,中间用tab键隔开\n");
    printf("|名字\t|密码\t|性别\t|年龄\t|学号\t|成绩\n");
    //添加单个学生的信息，不需要加用L.data[i].name,只有一个信息，一个学生结构体，而不是结构体数组!
    scanf("%s %s %s %d %d %d", data.name, data.password, data.sex, &data.age, &data.id, &data.grade);
    //尾插
    tail_insert_list(L,data);
    // fflush(stdout);
    // printf("%s %s %s %d %d %d\n", L->data[Line_Num].name, L->data[Line_Num].password, L->data[Line_Num].sex, L->data[Line_Num].age, L->data[Line_Num].id, L->data[Line_Num].grade);
    
    // 写入到文件中
    save_users(L, file_path, "a+",1);
    printf("用户添加成功!\n");

}

// 修改用户名、密码、成绩
void modifi_user(sq_list *L)
{
    // 接收文件中的数据
    // L = use_users(L, file_path);
    char my_name[36]; // 接收用户输入的姓名
    printf("请输入你需修改的学生:");
    scanf("%s", my_name);

    //先找到用户,再修改
    int index = find_by_name(L, my_name);
    int choice;
    puts("");
    printf("1-修改用户名和密码\t2-修改成绩\n");
    scanf("%d", &choice);
    if (choice==1)
    {
        //接收用户键盘输入的用户名和密码
        char s1[36];
        char s2[36];
        printf("请输入新的用户名和密码中间用空格隔开\n");
        scanf("%s %s", s1, s2);
        strcpy(L->data[index].name, s1);
        strcpy(L->data[index].password,s2);
        printf("用户名和密码修改成功!\n");
        // find_by_name(L, s1);
    }
    else if(choice == 2)
    {
        int new_grade;          //新的成绩
        printf("请输入新的成绩\n");
        scanf("%d", &new_grade);
        L->data[index].grade = new_grade;
        printf("成绩修改成功!\n");
        // find_by_name(L, my_name);
    }
    // printf("modifi=%p\n",L);

    // 覆盖写入到本地文件
    save_users(L, file_path, "w+", Line_Num);
/*
测试用
    Prt(L);
    puts("--------------------------------------------");
*/
}
